package com.server;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.client.services.SortService;

@SuppressWarnings("serial")
public class SortServiceImpl extends RemoteServiceServlet implements SortService {

	public int[] sortServer() {
		int[] array_zufallszahlen = new int[1000];
		//Array mit der Größe der max. Zufallszahl. Datentyp ist Boolean
		boolean zufallszahlen_benutzt[] = new boolean[10000];
		for (int i = 0; i < array_zufallszahlen.length; i++) {
			//Erzeugen der Zufallszahl, Zufallszahl ist größer als 0
			int zufallszahl = ((int)(Math.random() * 10000));
			if (zufallszahlen_benutzt[(int) zufallszahl]==false) {
				//wenn die Zahl noch nicht vergeben ist, wird sie hinzugefügt.
				array_zufallszahlen[i] = zufallszahl;
				//Die Zahl wird als benutzt markiert.
				zufallszahlen_benutzt[(int) zufallszahl] = true;
			}else {
				//Der Zähler wird um eins vermindert, da kein Element erzeugt wurde.
				i--;
			}
		}
		//Array kopieren
		int[] array_sort = new int[array_zufallszahlen.length];
		for (int i = 0; i < array_zufallszahlen.length; i++) {
			array_sort[i] = array_zufallszahlen[i];
		}

		quicksort(array_sort, 0, array_sort.length-1);

		int[] array_ausgabe = new int[array_zufallszahlen.length * 2];

		for (int i = 0; i < array_ausgabe.length/2; i++) {
			array_ausgabe[i] = array_zufallszahlen[i];
		}
		for (int i = array_ausgabe.length/2; i < array_ausgabe.length; i++) {
			array_ausgabe[i] = array_sort[i - array_ausgabe.length/2];
		}
		return array_ausgabe;
	}

	public static void quicksort(int[] array_zufallszahlen, int links_0, int rechts_0){
		//Initialisierung der lokalen Variablen
		int zeiger_links = links_0;
		int zeiger_rechts = rechts_0;
		int hilfsvariable;

		// Berechnung des Pivot-Element
		long pivot=array_zufallszahlen[(zeiger_links + zeiger_rechts) /2];

		//Solange sich die Zeiger nicht treffen
		while (zeiger_links <= zeiger_rechts)
		{
			//Pivot ist die Grenze
			//Sortierung von links
			while(array_zufallszahlen[zeiger_links]<pivot)
			{
				zeiger_links++;
			}
			//Sortierung von rechts.
			while(array_zufallszahlen[zeiger_rechts]>pivot)
			{
				zeiger_rechts--;
			}

			// Wenn die Werte getauscht werden m�ssen, werden sie getauscht.
			if (zeiger_links<=zeiger_rechts)
			{
				hilfsvariable=array_zufallszahlen[zeiger_links];
				array_zufallszahlen[zeiger_links]=array_zufallszahlen[zeiger_rechts];
				array_zufallszahlen[zeiger_rechts]=hilfsvariable;
				zeiger_links++;
				zeiger_rechts--;
			}
		}

		//Methode wird nun mit den neuen Teilen des Arrays aufgerufen(-->Rekursion)
		if(links_0 < zeiger_rechts) quicksort(array_zufallszahlen, links_0, zeiger_rechts);
		if(zeiger_links < rechts_0) quicksort(array_zufallszahlen, zeiger_links, rechts_0);
	}
}